package com.synchronous7;
//懒汉式：在类初始化时就直接创建单例对象，而类初始化过程是没有线程安全问题的
public class HungrySingleTest {
    static HungrySingle hs1 = null;
    static HungrySingle hs2 = null;
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                hs1 = HungrySingle.getInstance();
            }
        };
        Thread t2 = new Thread(){
            @Override
            public void run() {
                hs2 = HungrySingle.getInstance();
            }
        };
        t1.start();
        t2.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(hs1);
        System.out.println(hs2);
        System.out.println(hs1==hs2);
    }
}

//Java中产生死锁的四个必要条件是：
//
//        互斥使用，即当资源被一个线程使用（占有）时，别的线程不能使用该资源。
//        占有并等待，即一个线程占有了某个资源，并且正在等待其他线程释放该资源。
//        不可抢占，即一个线程已经占有了某个资源，并且正在等待其他线程释放该资源，但是其他线程无法强制夺取该资源。
//        循环等待，即若干个线程之间形成一种头尾相接的循环等待关系。



//解释死锁？
